#ifndef MT6701_H
#define MT6701_H

#include "stm32f1xx_hal.h"
#include "main.h"
#include <math.h>

// CS引脚控制宏
#define MT6701_CS_LOW()  HAL_GPIO_WritePin(MT6701_CS_GPIO_Port, MT6701_CS_Pin, GPIO_PIN_RESET)
#define MT6701_CS_HIGH() HAL_GPIO_WritePin(MT6701_CS_GPIO_Port, MT6701_CS_Pin, GPIO_PIN_SET)
#define MT6701_CS_ENABLE()  MT6701_CS_LOW()
#define MT6701_CS_DISABLE() MT6701_CS_HIGH()

// MT6701数据位定义
#define MT6701_STATUS_BITS_MASK 0xC000    // D15-D14为状态位
#define MT6701_ANGLE_BITS_MASK  0x3FFF    // D13-D0为角度数据
#define MT6701_ANGLE_RESOLUTION 16384     // 14位分辨率对应的值（文章中提到的16384）
#define MT6701_FULL_ANGLE       360.0f    // 全角度值
#define COUNT_PER_ROTATE        16384     // 每圈计数（与文章一致）
#define _2PI                    6.28318530718f // 2π

// 外部变量声明
extern uint16_t last_raw_angle;  // 上一次的原始角度值
extern int32_t track_count;      // 多圈计数
extern uint8_t current_byte_order_mode; // 当前字节顺序模式

extern uint8_t mt6701_rx_data[3]; // MT6701接收缓冲区
extern float encoder_angle;       // 最新解码的角度值（弧度）
extern float motor_logic_angle;   // 多圈逻辑角度值（弧度）
extern float position_cycle;      // 位置周期（默认为2π）

extern SPI_HandleTypeDef *hspi_mt6701;

extern void HAL_SPI_TxRxCpltCallback(SPI_HandleTypeDef *hspi);

// 函数声明
void MT6701_Init(SPI_HandleTypeDef *hspi);
void MT6701_StartReading(void); // 启动MT6701的数据接收
uint16_t MT6701_ReadRawData(void);
float MT6701_GetAngle(void);
float MT6701_GetMultiTurnAngle(void); // 获取多圈角度值
uint8_t calculate_crc(uint32_t data); // CRC计算函数
float cycle_diff(float diff, float cycle); // 周期差计算函数

#endif /* MT6701_H */